const jwt = require('jsonwebtoken');
const { Admin, Role, Permission } = require('../models');

const adminAuth = async (req, res, next) => {
  try {
    const token = req.header('Authorization')?.replace('Bearer ', '');
    
    if (!token) {
      return res.status(401).json({
        success: false,
        message: '请提供访问令牌'
      });
    }

    // 验证JWT token
    const decoded = jwt.verify(token, process.env.JWT_SECRET);
    
    // 检查是否为管理员token
    if (decoded.type !== 'admin') {
      return res.status(403).json({
        success: false,
        message: '权限不足，需要管理员权限'
      });
    }

    // 查找管理员
    const admin = await Admin.findByPk(decoded.id, {
      include: [{
        model: Role,
        as: 'roles',
        include: [{
          model: Permission,
          as: 'permissions'
        }]
      }]
    });

    if (!admin) {
      return res.status(401).json({
        success: false,
        message: '管理员账户不存在'
      });
    }

    // 检查账户状态
    if (admin.status !== 'active') {
      return res.status(403).json({
        success: false,
        message: '管理员账户已被禁用或锁定'
      });
    }

    // 检查账户是否被锁定
    if (admin.isLocked()) {
      return res.status(403).json({
        success: false,
        message: '管理员账户已被锁定'
      });
    }

    // 将管理员信息添加到请求对象
    req.admin = admin;
    req.adminId = admin.id;

    next();
  } catch (error) {
    if (error.name === 'JsonWebTokenError') {
      return res.status(401).json({
        success: false,
        message: '无效的访问令牌'
      });
    }
    
    if (error.name === 'TokenExpiredError') {
      return res.status(401).json({
        success: false,
        message: '访问令牌已过期'
      });
    }

    res.status(500).json({
      success: false,
      message: '权限验证失败',
      error: error.message
    });
  }
};

module.exports = adminAuth;